package com.kuangstudy.service.pv;

import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author 飞哥
 * @Title: 学相伴出品
 * @Description: 我们有一个学习网站：https://www.kuangstudy.com
 * @date 2021/5/20 15:46
 */
@Service
@Log4j2
public class BbsPvService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @return void
     * @Author 徐柯
     * @Description 具体每篇文章计数开始
     * @Date 15:50 2021/5/20
     * @Param [bbsid]
     **/
    public void addBssPv(Integer bbsid) {
        //1：建立一级缓存
        //2: 确定时间分片 1分钟，生产环境建议调大
        long mill1 = System.currentTimeMillis() / (1000 * 60 * 1);
        //3：在当前时间分片中，查看是否已经存在
        Map<Integer, Integer> integerIntegerMap = BbsPvServiceConstants.PV_MAP.get(mill1);
        log.info("integerIntegerMap:放入pv数是：{}", integerIntegerMap);
        // 4: 如果不存在创建就创建在增加1
        if (CollectionUtils.isEmpty(integerIntegerMap)) {
            integerIntegerMap = new ConcurrentHashMap<>();
            integerIntegerMap.put(bbsid, 1);
            // 4-1：把初始的分片PV统计数，放入到一级缓存中，供后续去在同一时间分片中去累加
            BbsPvServiceConstants.PV_MAP.put(mill1, integerIntegerMap);
        } else {
            //5：如果存在就在当前时间分片中累加。根据文章id取出当前时间分片的文章pv浏览数
            Integer bbspv = integerIntegerMap.get(bbsid);
            if (bbspv == null) {
                integerIntegerMap.put(bbsid, 1);
            } else {
                integerIntegerMap.put(bbsid, bbspv + 1);
            }
        }
    }


}
